package br.com.aeso.bancoCurriculo.model.comum.negocio.impl;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import br.com.aeso.bancoCurriculo.model.comum.excecoes.ConcorrenciaException;
import br.com.aeso.bancoCurriculo.model.comum.excecoes.NegocioException;
import br.com.aeso.bancoCurriculo.model.comum.negocio.EntidadeNegocio;
import br.com.aeso.bancoCurriculo.model.comum.negocio.Service;
import br.com.aeso.bancoCurriculo.model.util.Constantes;

/**
 * @author Giulliano Ferreira
 * 
 */
public abstract class ServiceImpl extends HibernateDaoSupport implements
	Service {

    public abstract EntidadeNegocio criar();

    public abstract Class<?> getClasseEntidade();

    public EntidadeNegocio obter(long chavePrimaria) throws NegocioException {
	return this.obter(chavePrimaria, getClasseEntidade());
    }

    public EntidadeNegocio obter(long chavePrimaria, Class<?> classe)
	    throws NegocioException {
	EntidadeNegocio entidade = null;

	entidade = (EntidadeNegocio) getHibernateTemplate().get(classe, chavePrimaria);

	if (entidade == null) {
	    throw new NegocioException(Constantes.ERRO_ENTIDADE_NAO_ENCONTRADA, classe.getName());
	}

	return entidade;
    }

    public long inserir(EntidadeNegocio entidadeNegocio)
	    throws NegocioException {
	Long chavePrimaria = null;

	chavePrimaria = (Long) getHibernateTemplate().save(entidadeNegocio);
	entidadeNegocio.setChavePrimaria(chavePrimaria);

	return chavePrimaria.longValue();
    }

    public void atualizar(EntidadeNegocio entidadeNegocio)
	    throws ConcorrenciaException, NegocioException {
	atualizar(entidadeNegocio, getClasseEntidade());
    }

    public void atualizar(EntidadeNegocio entidadeNegocio, Class<?> classe)
	    throws ConcorrenciaException, NegocioException {
	getHibernateTemplate().update(entidadeNegocio);
    }

    public void remover(EntidadeNegocio entidadeNegocio)
	    throws NegocioException {
	this.remover(entidadeNegocio);
    }
}